package com.zoe.onelink.business.service;

import com.zoe.onelink.business.dao.BizBaseDao;
import com.zoe.onelink.common.exception.ApiException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;

/**
 * <p>标题: Service层基类</p>
 * <p>描述: 通用增删改查操作</p>
 * <p>版权: Copyright (c) 2016</p>
 * <p>公司: </p>
 *
 * @version: 1.0
 * @author: ffs
 */
@Transactional
public class CrudService<T, D extends BizBaseDao<T>> {

    @Autowired
    protected D dao;

    /**
     * 查询单条判空操作（Optional，手动处理异常）
     *
     * @param id id
     * @return 单条记录
     */
    public Optional<T> findOne(String id) throws Exception {
        return Optional.ofNullable(dao.getById(id));
    }

    /**
     * 查询单条判空操作（自动抛错）
     *
     * @param id id
     * @return 单条记录
     */
    public T findOneM(String id) throws Exception {
        T temp = dao.getById(id);
        if (temp == null) {
            throw ApiException.createEx("RECORD_NULL", id);
        }
        return temp;
    }

    /**
     * 查询
     *
     * @param id id
     * @return 单条记录
     */
    public T getById(String id) throws Exception {
        return dao.getById(id);
    }

    /**
     * 查询
     *
     * @param entity 实体
     * @return 单条记录
     */
    public T get(T entity) throws Exception {
        return dao.get(entity);
    }

    /**
     * 查询列表
     *
     * @param entity 实体
     * @return 列表
     */
    public List<T> findList(T entity) throws Exception {
        return dao.findList(entity);
    }

    /**
     * 查询列表
     *
     * @param id 实体
     * @return 列表
     */
    public List<T> findListById(String id) throws Exception {
        return dao.findListById(id);
    }

    /**
     * 查询所有数据列表
     *
     * @param entity 实体
     * @return 列表
     */
    public List<T> findAllList(T entity) throws Exception {
        return dao.findAllList(entity);
    }

    /**
     * 插入
     *
     * @param entity 实体
     * @return 返回插入记录数
     */
    public int insert(T entity) throws Exception {
        return dao.insert(entity);
    }

    /**
     * 批量插入
     *
     * @param entityList 实体集合
     * @return 返回插入记录数
     */
    public int insertBatch(List<T> entityList) throws Exception {
        return dao.insertBatch(entityList);
    }

    /**
     * 批量插入
     * jdbc方式
     *
     * @param entityList 实体集合
     * @return 返回插入记录数
     */
    public int insertBatchByJdbc(List<T> entityList) throws Exception {
        return dao.insertBatchByJdbc(entityList);
    }

    /**
     * 更新
     *
     * @param entity 实体
     * @return 返回更新记录数
     */
    public int update(T entity) throws Exception {
        return dao.update(entity);
    }

    /**
     * 批量更新
     *
     * @param entityList 实体集合
     * @return 返回更新记录数
     */
    public int updateBatch(List<T> entityList) throws Exception {
        return dao.updateBatch(entityList);
    }


    /**
     * 批量更新
     * jdbc方式
     *
     * @param entityList 实体集合
     * @return 返回更新记录数
     */
    public int updateBatchByJdbc(List<T> entityList) throws Exception {
        return dao.updateBatchByJdbc(entityList);
    }

    /**
     * 物理删除
     *
     * @param entity 实体
     * @return 返回删除记录数
     */
    public int delete(T entity) throws Exception {
        return dao.delete(entity);
    }

    /**
     * 批量删除
     * jdbc方式
     *
     * @param entityList 实体集合
     * @return 返回删除记录数
     */
    public int deleteBatchByJdbc(List<T> entityList) throws Exception {
        return dao.deleteBatchByJdbc(entityList);
    }

    /**
     * 批量物理删除(集合)
     *
     * @param list 集合
     * @return 返回删除记录数
     */
    public int deleteBatchByList(List list) throws Exception {
        return dao.deleteBatchByList(list);
    }

    /**
     * 批量物理删除(数组)
     *
     * @param ids 数组
     * @return 返回删除记录数
     */
    public int deleteBatchByString(String[] ids) throws Exception {
        return dao.deleteBatchByString(ids);
    }

    /**
     * 更新有效标志（逻辑删除）
     *
     * @param entity 实体 必须传入 validFlag
     * @return 返回更新记录数
     */
    public int updateValidFlag(T entity) throws Exception {
        return dao.updateValidFlag(entity);
    }
}
